<?


JCAT_Package::ImportClass( ROOT_PATH.'Classes/Coder/class.CoderDocBase.php') ;

class UICtrlGtkTreeDoc extends UICtrlDocBase 
{
	
	/**
	 * what's this
	 * 
	 * @access	public
	 * @param	$sPath=''	string	What's this Parameter ?
	 * @return	array
	 */
	public function UICtrlGtkTreeDoc($sPath='')
	{
		$this->UICtrlDocBase( __CLASS__, $sPath ) ;
	}

	/**
	 * what's this
	 * 
	 * @access	public
	 * @static 
	 * @return	string
	 */
	static public function GetControllerClassName()
	{
		return preg_replace('/Doc$/','',__CLASS__) ;
	}
	
	/**
	 * what's this
	 * 
	 * @access	public
	 * @return	void
	 */
	public function CreateColumnIterator()
	{
		$arrColumns = $this->Get('Columns') ;
		if(!$arrColumns)
		{
			$arrColumns = array() ;
		}
			
		JCAT_Package::ImportClass('JCAT_ArrayIterator',JCAT::PACKAGE_PATTERN) ;
		return new JCAT_ArrayIterator($arrColumns) ;
	}
	
	/**
	 * What's this Method ?
	 * 
	 * @access	protected
	 * @return	void
	 */
	protected function CreateNewDocument()
	{
		// 创建 新的文件 内容 :::::::::::::::::::
		$aTemplate = new JCAT_UIHtml() ;
		
		// 设置变量
		$aTemplate->SetVar('TheDoc',$this) ;
		
		// 模版文件
		$sTemplateFile = dirname(__FILE__).'/template.UICtrlGtkTree.php' ;
		
		// 产生内容
		$sNewSource = $aTemplate->Display( $sTemplateFile,false) ;
		
		// 调用 父类 创建一个空文件
		parent::CreateNewDocument() ;
		
		// 写入新文件
		file_put_contents($this->GetPath(),$sNewSource) ;
	}
	
	
	/**
	 * 将序列化以后的内容存入到 文档
	 * 
	 * @access	protected
	 * @param	$sPath				文件路径
	 * @param	$sByteContents		字节内容
	 * @param	$bAsBinary			作为二进制存储
	 * @return	bool
	 */
	protected function SaveToFile( $sPath, $sByteContents, $bAsBinary=false )
	{
		// 调用父类
		parent::SaveToFile( $sPath, $sByteContents, $bAsBinary ) ;
		
		// 产生 创建模型 的代码
		$this->WirteUnmodifiableBlock($sPath,'Create Model',$this->CreateCode_CreateModel(),CoderDocBase::UnmodifiableBlockKind_Code,2) ;
		
		// 产生 初始化 视图列 的代码
		$this->WirteUnmodifiableBlock($sPath,'Setting Columns',$this->CreateCode_CreateColumns(),CoderDocBase::UnmodifiableBlockKind_Code,2) ;
		
		// 产生 定义列常量的代码
		$this->WirteUnmodifiableBlock($sPath,'Define Column Consts',$this->CreateCode_DefineConstForColumn(),CoderDocBase::UnmodifiableBlockKind_Code,1) ;
		
		// 完成 返回 
		return true ;
	}
	
	

	public function CreateCode_IncludeParentClass()
	{
		return "JCAT_Package::ImportClass('JCAT_UIGtkCtrlTree',JCAT::PACKAGE_UICTRLGTK) ;" ;
	}

	// 创建 模型
	public function CreateCode_CreateModel()
	{
		$sCode = "		\$aModel = new GtkTreeStore(\r\n" ;
		
		$aIterator = $this->CreateColumnIterator() ;
		$aIterator->First() ;
		while( !$aIterator->IsDone() )
		{
			$arrColumnInfo = $aIterator->Current() ;
			
			// 代码 缩进
			$sCode.= str_repeat("\t",3) ;
			
			// ','
			if($aIterator->CurrentKey()>0)
				$sCode.= ', ' ;
			
			$sCode.= $arrColumnInfo[LstColumns::CLM_MODEL_TYPE]."\r\n" ;
			
			$aIterator->Next() ;
		}
		$sCode.= "			) ;" ;
		
		return $sCode ;
	}
	
	// 创建视图列
	public function CreateCode_CreateColumns()
	{
		$arrCodeForColumns = array() ;
		$sPreTab = str_repeat("\t",2) ;
		
		// 迭代处理 每一个 Column
		$aIterator = $this->CreateColumnIterator() ;
		$aIterator->First() ;
		$nIdx = 0 ;
		while( !$aIterator->IsDone() )
		{
			$arrColumnInfo = $aIterator->Current() ;
				
			$sConstName = trim($arrColumnInfo[LstColumns::CLM_CONST_NAME]) ;
			
			$sRenderVarName = '$aRenderForColumn'.$nIdx ;						// Rander 对象的变量名
			$sColumnVarName = '$wndColumn'.$nIdx ;								// GtkTreeViewColumn 对象的变量名
			$sColumnIdx = empty( $sConstName )?									// 列 顺序
					$nIdx: "self::{$sConstName}" ;	
			$bEditable = $arrColumnInfo[LstColumns::CLM_EDITABLE] ;				// 是否可编辑
			$sRenderType = $arrColumnInfo[LstColumns::CLM_VIEW_TYPE] ;			// Rend 类型
			$bIsShow =  intval($arrColumnInfo[LstColumns::CLM_SHOW]);			// 是否可见
			$nCellWidth =  intval($arrColumnInfo[LstColumns::CLM_WIDTH]);		// Cell 的宽度
			$sHeadName = str_replace('"','\\"',$arrColumnInfo[LstColumns::CLM_HEAD_NAME] );
																				// Column Head 名称
			
			$sRenderClassName = '' ;											// Render 类的名称
			$sColumnType = '' ;													// Column 类型
			$arrCodeLines = array() ;											// 设定 Render 对象的 代码
			
					
			// 开始
			switch( $sRenderType )
			{
				case 'Text' :
					
					$sRenderClassName = 'GtkCellRendererText' ;
					$sColumnType = 'text' ;

					break ;
									
				case 'Radio' :

					$sRenderClassName = 'GtkCellRendererToggle' ;
					$sColumnType = 'active' ;
					
					
					break ;
									
				case 'Checkbox' :
					
					$sRenderClassName = 'GtkCellRendererToggle' ;
					$sColumnType = 'active' ;
									
					break ;
							
				case 'Combo' :
					
					$sRenderClassName = 'GtkCellRendererCombo' ;
					$sColumnType = 'text' ;
					
					// 格外的设置代码
					$arrCodeLines[]= "{$sPreTab}{$sRenderVarName}->set_property('has-entry',false) ;" ;
					
					break ;
	
				case 'ComboEntry' :
					
					$sRenderClassName = 'GtkCellRendererCombo' ;
					$sColumnType = 'text' ;
					
					break ;				
									
				case 'ProgressBar' :
					
					$sRenderClassName = 'GtkCellRendererProgress' ;
					$sColumnType = 'pixbuf' ;
					
					break ;
									
				case 'Image' :
					
					$sRenderClassName = 'GtkCellRendererPixbuf' ;
					$sColumnType = 'pixbuf' ;
					
					break ;
				
				default :
					JCAT_ASSERT::ASSERT_(0,"错误的类型：{$arrColumnInfo[LstColumns::CLM_VIEW_TYPE]}") ;
					break ;
					
			}
			
			// 创建 Render 对象的代码
			array_unshift($arrCodeLines,"{$sPreTab}{$sRenderVarName} = new {$sRenderClassName}() ;") ;
			array_unshift($arrCodeLines,JCAT_Language::Sentence('%s// 视图列：%s',$sPreTab,$sHeadName)) ;
			
			// 对于 'Checkbox','Radio' 类型
			if( in_array($sRenderType,array('Checkbox','Radio')) )
			{
				$arrCodeLines[]= "{$sPreTab}{$sRenderVarName}->set_property('activatable',".($bEditable?'true':'false').") ;" ;

				// 连接事件
				if($bEditable)
				{
					$arrCodeLines[]= "{$sPreTab}{$sRenderVarName}->connect('toggled',array(\$this,'OnActiveToggled'),{$sColumnIdx}) ;" ;
				}
			}
			
			// Render 宽度
			if( $nCellWidth>=0 )
			{
				$arrCodeLines[]= "{$sPreTab}{$sRenderVarName}->set_property('width',{$nCellWidth}) ;" ;
			}
			
			// 对于 'Combo','ComboEntry','Text' 类型
			if( in_array($sRenderType,array('Combo','ComboEntry','Text')) )
			{
				$arrCodeLines[]= "{$sPreTab}{$sRenderVarName}->set_property('editable',".($bEditable?'true':'false').") ;" ;
				
				// 连接事件
				if($bEditable)
				{
					$arrCodeLines[]= "{$sPreTab}{$sRenderVarName}->connect('edited',array(\$this,'OnTextEdit'),{$sColumnIdx}) ;" ;
				}
			}
			

			// 创建  GtkTreeViewColumn 对象
			$arrCodeLines[] = 
				"{$sPreTab}{$sColumnVarName} = new GtkTreeViewColumn(JCAT_Language::Sentence('{$sHeadName}'),{$sRenderVarName},'{$sColumnType}',{$sColumnIdx}) ;" ;
		
			// 对于 'Image' 类型
			if($sRenderType==='Image')
			{
				$arrCodeLines[]= "{$sPreTab}{$sColumnVarName}->set_cell_data_func({$sRenderVarName},array(\$this,'OnRenderPixbuf'),{$sColumnIdx}) ;" ;
			}
			
			// 不可见 列
			if(!$bIsShow)
			{
				$arrCodeLines[]= "{$sPreTab}{$sColumnVarName}->set_visible(false) ;" ;
			}
			
			// 加入 GtkTreeViewColumn 对象
			$arrCodeLines[] = "{$sPreTab}\$wndTreeView->append_column({$sColumnVarName}) ;" ;
			
			// 组装 －－－－－－－－－－－－－－－－－－－－－－
			$arrCodeForColumns[] = implode("\r\n",$arrCodeLines) ;
			
			$nIdx ++ ;
			$aIterator->Next() ;
		}
		
		return implode("\r\n\r\n",$arrCodeForColumns) ;
	}
	
	// 为视图列 定义常量
	public function CreateCode_DefineConstForColumn()
	{
		$arrLine = array() ;
		
		$aIterator = $this->CreateColumnIterator() ;
		$aIterator->First() ;
		$nIdx = 0 ;
		while( !$aIterator->IsDone() )
		{
			$arrColumnInfo = $aIterator->Current() ;
			
			$sConstName = trim($arrColumnInfo[LstColumns::CLM_CONST_NAME]) ;
			if( !empty($sConstName) )
			{
				$arrLine[]= "	const {$sConstName} = {$nIdx} ;" ;
			}
			
			$nIdx ++ ;
			$aIterator->Next() ;
		}
		
		return implode("\r\n",$arrLine) ;
	}
	
}

JCAT_Package::ImportClass('JCAT_UIHtml',JCAT::PACKAGE_UIHTML) ;
?>